<?php
/**
 * 图片缩放水印类
 *
 */
class cls_photo
{
    protected $waterrate = 0.2; //水印图标在图片上的比例
    protected $width = 300; //缩略图默认宽度
    protected $height = 200; //缩略图默认高度
    protected $padding = 5;  //水印图到边的距离
    protected $water_mark = "./water.png";
    protected $water_mark_pos = 5;//水印图片位置（1=左上角，2=右上角，3=左下角,4=右下角,5中央）
    protected $watermode = 0;// 0缩略图时不打水印 1缩略图时打水印
    protected $magick_handle;//图片操作句柄
    protected $format = array ( 'jpg','gif','png','jpeg' ); // 图片文件格式限定
    protected $smallpic_mode = 2;//默认模式 0为不生成缩略图， 1为裁切缩放 ，2为比例缩放 3为缩放填充模式

    /**
     * 设置图片类参数
     *
     * @param $arg 图片参数 多次可放入数组里 如下
     * @param $protected 参数值
     * array(
     *      'waterrate'=>0.2,
     *      'water_mark'=>'./water.png',
     *      'water_mark_pos'=>4,
     *      'smallpic_mode'=>1
     *      );
     * @return ture/false
     */
    public function set_args ( $arg,$val="" )
    {
        $params = array ( 'waterrate','water_mark','water_mark_pos','smallpic_mode','watermode','width','height' );
        if ( is_array ( $arg ) )
        {
            foreach ( $arg as $k =>$v )
            {
                if ( in_array ( $k,$params ) )
                {
                    $this->$k = $v;
                }
            }
        }
        else
        {
            if ( empty ( $val ) )
            {
                return false;
            }
            else
            {
                if ( in_array ( $arg,$params ) )
                {
                    $this->$arg = $val;
                }
            }
        }
        return true;
    }

    /**
     * 图片缩放
     *
     * @param $src_file 源文件路径
     * @param $dst_file 目标文件路径
     * @return 缩略图片路径/false
     */
    public function scale ( $src_file,$dst_file="" )
    {
        $dst_width  = $this->width;
        $dst_height = $this->height;
        $mode       = $this->smallpic_mode;
        $magic_water_handle = NewMagickWand();
        if ( !MagickReadImage ( $magic_water_handle, $src_file ) ) return false;

        //类型
        $srcext = strtolower ( MagickGetImageFormat ( $magic_water_handle ) );
        if ( $srcext=='bmp' )
        {
            $srcext = 'jpeg';
        }
        if ( !in_array ( $srcext,$this->format ) ) return false;
        //尺寸
        $src_width = MagickGetImageWidth ( $magic_water_handle );
        $src_height = MagickGetImageHeight ( $magic_water_handle );

        //裁切缩放模式
        if ( $mode == 1 )
        {
            $pos_x=$pos_y = 0;//裁切临时位置
            $src_widthc = $src_width;//裁切临时宽度
            $src_heightc = $src_height;//裁切临时高度
            if ( $src_width/$src_height>$dst_width/$dst_height )
            {
                $src_widthc = $src_height*$dst_width/$dst_height;
                $pos_x = ( $src_width-$src_widthc ) /2;

            }
            else
            {
                $src_heightc = $src_width*$dst_height/$dst_width;
                $pos_y = ( $src_height-$src_heightc ) /2;
            }
            MagickCropImage ( $magic_water_handle,$src_widthc,$src_heightc,$pos_x,$pos_y );//裁切
            //因为MagickCropImage函数后，Gif 图像改，但画布不变
            $this->magick_handle = NewMagickWand();
            MagickNewImage ( $this->magick_handle,$src_widthc,$src_heightc,'#ffffff' );
            MagickSetFormat ( $this->magick_handle,$srcext );
            MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp,0,0 );
            //缩放
            MagickScaleImage ( $this->magick_handle, $dst_width, $dst_height );

        }
        //比例缩放模式
        if ( $mode == 2 )
        {
            if ( $src_width/$src_height>$dst_width/$dst_height )
            {
                $dst_height=$dst_width*$src_height/$src_width;
            }
            else
            {
                $dst_width=$dst_height*$src_width/$src_height;
            }
            $this->magick_handle=$magic_water_handle;//替换
            MagickScaleImage ( $this->magick_handle, $dst_width, $dst_height );//缩放
        }
        //缩放填充模式
        if ( $mode == 3 )
        {
            if ( $src_width/$src_height>$dst_width/$dst_height )
            {
                $dst_heightc=$dst_width*$src_height/$src_width;
                $dst_widthc=$dst_width;
            }
            else
            {
                $dst_widthc=$dst_height*$src_width/$src_height;
                $dst_heightc=$dst_height;
            }
            MagickScaleImage ( $magic_water_handle, $dst_widthc, $dst_heightc );//缩放
            $this->magick_handle = NewMagickWand();
            MagickNewImage ( $this->magick_handle,$dst_width,$dst_height,$this->smallpic_bgcolor );
            MagickSetFormat ( $this->magick_handle,$srcext );
            MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp, ( $dst_width-$dst_widthc ) /2, ( $dst_height-$dst_heightc ) /2 );
        }
        //打水印
        if ( $this->watermode == 1 )
        {
            $this->set_mark();
        }
        if ( empty ( $dst_file ) )
        {
            //建立临时文件
            $dst_file = tempnam ( $_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG" );
        }
        MagickWriteImage ( $this->magick_handle, $dst_file );
        return $dst_file;
    }

    /**
     * 打水印
     *
     * @param $src_file 要打水印的图片路径
     * @param $dst_file 生产水印的文件保存路径，为空则生产随机临时文件
     * @return 水印文件路径/false
     */
    public function water_mark ( $src_file,$dst_file="" )
    {
        $this->magick_handle = NewMagickWand();
        if ( !MagickReadImage ( $this->magick_handle, $src_file ) )
            return false;
        $this->set_mark();
        if ( empty ( $dst_file ) )
        {
            //建立临时文件
            $dst_file = tempnam ( $_SERVER["SINASRV_CACHE_DIR"],"TMP_IMG" );
        }
        MagickWriteImage ( $this->magick_handle, $dst_file );
        return $dst_file;
    }

    /**
     * 对内接口
     * 给图片打水印
     *
     */
    protected  function set_mark()
    {

        //尺寸
        $dst_width = MagickGetImageWidth ( $this->magick_handle );
        $dst_height = MagickGetImageHeight ( $this->magick_handle );
        //处理水印图
        if ( $this->water_mark && is_file ( $this->water_mark ) )
        {
            $magic_water_handle = NewMagickWand();
            MagickRemoveImage ( $magic_water_handle );
            if ( MagickReadImage ( $magic_water_handle, $this->water_mark ) )
            {
                MagickScaleImage ( $magic_water_handle, $dst_width*$this->waterrate, $dst_width*$this->waterrate*MagickGetImageHeight ( $magic_water_handle ) /MagickGetImageWidth ( $magic_water_handle ) );//缩放水印到图片的1/5
                if ( $this->water_mark_pos == 1 )
                {
                    $left = $this->padding;
                    $top = $this->padding;
                }
                elseif ( $this->water_mark_pos == 2 )
                {
                    $left = $dst_width-$this->padding-MagickGetImageWidth ( $magic_water_handle );
                    $top = $this->padding;
                }
                elseif ( $this->water_mark_pos == 3 )
                {
                    $left = $this->padding;
                    $top = $dst_height -$this->padding-MagickGetImageHeight ( $magic_water_handle );
                }
                elseif ( $this->water_mark_pos == 4 )
                {
                    $left = $dst_width-$this->padding-MagickGetImageWidth ( $magic_water_handle );
                    $top =$dst_height -$this->padding-MagickGetImageHeight ( $magic_water_handle );
                }
                elseif ( $this->water_mark_pos == 5 )
                {
                    $left = ( $dst_width-MagickGetImageWidth ( $magic_water_handle ) ) /2;
                    $top = ( $dst_height -MagickGetImageHeight ( $magic_water_handle ) ) /2;
                }
                MagickCompositeImage ( $this->magick_handle,$magic_water_handle,MW_OverCompositeOp,$left,$top );
            }
        }
    }
}
